package converter;

import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Liefert die Funktionalitaet zum Schreiben von Produktdaten in eine XML Datei.<br>
 * Daten werden in einer output.xml Datei abgespeichert.<br><br>
 * Zusaetzlich hat man die Moeglichkeit die zwischengespeicherten Produkte auf Vollstaendigkeit ueberpruefen<br>
 * und gegebenenfalls aussortieren zu lassen.
 * 
 * @author Patrick Bauer
 */
public class CatalogXMLWriter {

    /**
     * Nach dem ueberpruefen der Produkte auf vollstaendigkeit, wird der XML Header geschrieben.<br>
     * Danach werden alle Produkte einzeln angestossen sich selbst in die Datei mit reinzuschreiben.
     * 
     * @param elementList die auszugebende Produktliste
     */
    public void write(ArrayList<XMLElement> elementList) {
        FileWriter writer = null;
        SimpleDateFormat formatter = new SimpleDateFormat ("dd.MM.yyyy HH:mm");
        Date currentTime = new Date();
        int i;
        int j;
        
        this.clearList(elementList);
        
        try {
            writer = new FileWriter("output.xml");
            
            //header
            writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + System.getProperty("line.separator"));
            writer.write("<!DOCTYPE Katalog SYSTEM \"Katalog.dtd\">" + System.getProperty("line.separator"));
            writer.write("<Katalog>" + System.getProperty("line.separator"));
            
                
                //Books
                writer.write("\t<BuchBestand>" + System.getProperty("line.separator"));

                j = 0;
                for(i = 0; i < elementList.size(); i++) {
                    if(elementList.get(i) instanceof BookElement){
                        elementList.get(i).write(writer);
                        j++;
                    }
                }

                writer.write("\t\t<MetaDaten anzahlEintraege=\"" + j + "\" letzeAenderung=\"" + formatter.format(currentTime) + "\"></MetaDaten>" + System.getProperty("line.separator"));
                writer.write("\t</BuchBestand>" + System.getProperty("line.separator"));
            
                
                //DVDs
                writer.write("\t<DVDBestand>" + System.getProperty("line.separator"));

                j = 0;
                for(i = 0; i < elementList.size(); i++) {
                    if(elementList.get(i) instanceof DVDElement){ 
                        elementList.get(i).write(writer);
                        j++;
                    }
                }

                writer.write("\t\t<MetaDaten anzahlEintraege=\"" + j + "\" letzeAenderung=\"" + formatter.format(currentTime) + "\"></MetaDaten>" + System.getProperty("line.separator"));
                writer.write("\t</DVDBestand>" + System.getProperty("line.separator"));
            
                
                //Audio
                writer.write("\t<TontraegerBestand>" + System.getProperty("line.separator"));

                j = 0;
                for(i = 0; i < elementList.size(); i++) {
                    if(elementList.get(i) instanceof AudioElement){ 
                        elementList.get(i).write(writer);
                        j++;
                    }
                }

                writer.write("\t\t<MetaDaten anzahlEintraege=\"" + j + "\" letzeAenderung=\"" + formatter.format(currentTime) + "\"></MetaDaten>" + System.getProperty("line.separator"));
                writer.write("\t</TontraegerBestand>" + System.getProperty("line.separator"));

            
                //EBooks
                writer.write("\t<eBookBestand>" + System.getProperty("line.separator"));

                j = 0;
                for(i = 0; i < elementList.size(); i++) {
                    if(elementList.get(i) instanceof EBookElement){ 
                        elementList.get(i).write(writer);
                        j++;
                    }
                }

                writer.write("\t\t<MetaDaten anzahlEintraege=\"" + j + "\" letzeAenderung=\"" + formatter.format(currentTime) + "\"></MetaDaten>" + System.getProperty("line.separator"));
                writer.write("\t</eBookBestand>" + System.getProperty("line.separator"));
            
            
            //footer
            writer.write("\t<MetaDaten anzahlEintraege=\"" + elementList.size() + "\" letzeAenderung=\"" + formatter.format(currentTime) + "\"></MetaDaten>" + System.getProperty("line.separator"));
            writer.write("</Katalog>" + System.getProperty("line.separator"));         
            
            writer.close();
        } catch (IOException ex) {
            Logger.getLogger(CatalogXMLWriter.class.getName()).log(Level.SEVERE, null, ex);
        }
                
    }

    /**
     * Ueberprueft die uebergebene Liste auf vollstaendigkeit.<br>
     * Produkte mit zu vielen fehlenden Eigenschaften werden aussortiert und damit von der weiteren Verarbeitung ausgeschlossen.<br><br>
     * Nach Abschluss der Uberpruefung wird ausgegeben, wie viele Produkte der einzelnen Bestaende aussortiert wurden.
     * 
     * @param elementList die zu ueberpruefende Produktliste
     */
    private void clearList(ArrayList<XMLElement> elementList) {
        ArrayList collection = new ArrayList();
        int droppedDVD = 0;
        int droppedBook = 0;
        int droppedEBook = 0;
        int droppedAudio = 0;
        
        for(int i = 0; i < elementList.size(); i++) {
            if(elementList.get(i).countUnknown() > 3){
                 
                collection.add(elementList.get(i));
                
                if(elementList.get(i) instanceof DVDElement){
                     droppedDVD++;
                }
                 
                if(elementList.get(i) instanceof BookElement){
                     droppedBook++;
                }
                 
                if(elementList.get(i) instanceof EBookElement){
                     droppedEBook++;
                }
                 
                if(elementList.get(i) instanceof  AudioElement){
                     droppedAudio++;
                }

            }
        }
        
        elementList.removeAll(collection);
        
        System.out.println("Es wurden " + droppedDVD + " DVDs verworfen.");
        System.out.println("Es wurden " + droppedBook + " Buecher verworfen.");
        System.out.println("Es wurden " + droppedEBook + " EBooks verworfen.");
        System.out.println("Es wurden " + droppedAudio + " Tontraeger verworfen.");
    }
    
}
